#include "./medianFilter1D.h"

#include <algorithm>
#include <stdexcept>

using std::invalid_argument;
using std::max;
using std::min;
using std::sort;

/**
 * @brief 一维中值滤波实现​。
 * 适用于信号处理（如去除噪声）：
 *
 * @param input
 * @param windowSize
 * @return vector<double>
 */
vector<double> medianFilter1D(const vector<double>& input, int windowSize)
{
    if (windowSize <= 0) {
        throw invalid_argument("窗口大小必须为正整数");
    }
    if (windowSize % 2 == 0) {
        throw invalid_argument("窗口大小必须为奇数"); // 保证对称性
    }

    int half = windowSize / 2;
    auto n = (int)input.size();
    vector<double> output(n);

    for (int i = 0; i < n; ++i) {
        // 确定窗口边界（处理边缘）
        int start = max(0, i - half);
        int end = min(n - 1, i + half);
        int windowSizeLocal = end - start + 1;

        // 提取窗口数据并排序
        vector<double> window(input.begin() + start, input.begin() + end + 1);
        sort(window.begin(), window.end());

        // 取中值
        output[i] = window[windowSizeLocal / 2];
    }

    return output;
}
